cpp: model Protocol Buffers parse/serialize taint flow - #22448
Conversation
There was a problem hiding this comment.
Pull request overview
Adds C++ taint-flow summaries for Protocol Buffers MessageLite APIs and inherited generated message types.
Changes:
- Models parse/merge and serialization flows.
- Adds representative flow tests and expected results.
- Documents the analysis improvement.
Reviewed changes
Copilot reviewed 5 out of 5 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
cpp/ql/lib/ext/Protobuf.model.yml |
Defines protobuf flow summaries. |
cpp/ql/test/library-tests/dataflow/external-models/protobuf.cpp |
Adds protobuf test fixtures. |
cpp/ql/test/library-tests/dataflow/external-models/flow.expected |
Updates flow expectations. |
cpp/ql/test/library-tests/dataflow/external-models/steps.expected |
Updates summary-step expectations. |
cpp/ql/lib/change-notes/2026-08-27-protobuf-models.md |
Records the new models. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| - ["google::protobuf", "MessageLite", True, "ParseFromZeroCopyStream", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] | ||
| - ["google::protobuf", "MessageLite", True, "ParsePartialFromZeroCopyStream", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] | ||
| - ["google::protobuf", "MessageLite", True, "ParseFromBoundedZeroCopyStream", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] | ||
| - ["google::protobuf", "MessageLite", True, "ParsePartialFromBoundedZeroCopyStream", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] | ||
| - ["google::protobuf", "MessageLite", True, "MergeFromBoundedZeroCopyStream", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] |
jketema
left a comment
There was a problem hiding this comment.
Thanks for this. I made a brief first pass over this, which should hopefully put you on the right path.
jketema
left a comment
There was a problem hiding this comment.
Some further comments. I think the .yml file looks good now. I would still significantly reduce the number of comments, which don't seem to add much.
|
|
|
Internal testing showed nothing out of the ordinary. So if you fix the test, then this can be merged. |
jketema
left a comment
There was a problem hiding this comment.
LGTM. Going to fix the broken test afterwards to just get this in. Thanks for the contribution!
This apparently conflicts with the other PR of you that I just merged, and as don't have permission to push to your branch, I cannot resolve this myself. |
49ffde7 to
938e041
Compare
Add flow summaries for the protobuf C++ API on google::protobuf::MessageLite (subtypes=true, so Message and all generated messages are covered): - ParseFrom*/MergeFrom* (string, array, Cord, istream, zero-copy and coded-stream forms) propagate taint from the encoded input to the message. - SerializeTo*/AppendTo* propagate taint from the message to the output buffer or stream; SerializeAs*/... to the return value. File-descriptor variants are omitted (the fd is an int, not a buffer).
Co-authored-by: Jeroen Ketema <93738568+jketema@users.noreply.github.com>
Replace the step-coverage function with one sink test per model row using a template source, declare the Cord overloads of the ToString methods in the stub, drop the incorrect istream comment from the fixture, and shorten the model-file and change-note comments per review.
938e041 to
d603cdd
Compare
| template<class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > | ||
| class basic_string { | ||
| public: | ||
| basic_string(); | ||
| basic_string(const charT* s, const Allocator& a = Allocator()); | ||
| const charT* data() const; | ||
| size_t size() const; | ||
| }; | ||
|
|
||
| typedef basic_string<char> string; |
There was a problem hiding this comment.
This conflicts with the definition in cpp/ql/test/library-tests/dataflow/external-models/asio_streams.cpp. This will need to be factored out into a header file, as this currently causes a test failure.
There was a problem hiding this comment.
Thanks @jketema for the review. Moved the shared definition to the header file to avoid test failure.
Looks like this hasn't been updated. The test still fails. |
Share standard string stubs between the protobuf and Asio fixtures and regenerate expectations for their new source locations. Add the eight missing protobuf signature expectations.
Add flow summaries for the protobuf C++ API on google::protobuf::MessageLite (subtypes=true, so Message and all generated messages are covered):